; BASIC interpreter from Rolf-Dieter Klein's book. ; ; Modified to assemble online at asm80.com ; ; Uses 8080 mnemonics ; and one Z80 mnemonic (LDIR) ; asm80.com does not allow mixing by default. ; ; ;; .PABS ;; .PHEX ; ; RDK BASIC INTERPRETER V3.2 1980-03-16 ; .ORG $1000 ;; ANBAS=\ " ANFANGS ADRESSE BASIC" ANBAS= " ANFANGS ADRESSE BASIC" ;; .LOC 100H ; BEI CPM .ORG $100 JMP BEGINN ;; .LOC ANBAS-29 .ORG $FE3 BEGINN: LXI SP,STACK MVI A,0C9H STA HAUPTP CALL HAUPTP ANF: DCX SP DCX SP POP D LXI H,HAUPTP-ANF DAD D LXI D,HAUPTP LXI B,ENDE-BEGINN ;; LDIR ; Z80 instruction! db $ED,$80 JMP START ;HAUPTPROGRAMM HAUPTP: JMP START JMP RSTART CI: JMP 0F003H ECHO: JMP 0F009H CSTS: JMP 0F012H COMP: MOV A,H CMP D RNZ MOV A,L CMP E RET IGNB: LDAX D CPI " " RNZ INX D JMP IGNB FINI: POP PSW CALL FIN JMP QWHAT TSTV: CALL IGNB SUI 040H RC JNZ TV1 INX D CALL PARN DAD H JC QHOW PUSH D XCHG CALL SIZE CALL COMP JC ASORRY LHLD TXTEND CALL SUBDE POP D RET TV1: CPI 01BH CMC RC INX D LXI H,VARBGN RLC ADD L MOV L,A MVI A,0 ADC H MOV H,A RET TSTC: XTHL CALL IGNB CMP M TC1: INX H Jz TC2 PUSH B MOV C,M MVI B,0 DAD B POP B DCX D TC2: INX D INX H XTHL RET TSTNUM: LXI H,0 MOV B,H CALL IGNB TN1: CPI "0" RC CPI 03AH RNC MVI A,0F0H ANA H JNZ QHOW INR B PUSH B MOV B,H MOV C,L DAD H DAD H DAD B DAD H LDAX D INX D ANI 0FH ADD L MOV L,A MVI A,0 ADC H MOV H,A POP B LDAX D JP TN1 QHOW: PUSH D AHOW: LXI D,HOW JMP ERROR HOW: DB "HOW?", $0DH, $0AH ;; .ASCII /HOW? ;; / OK: DB "READY", $0DH, $0AH ;; .ASCII /READY ;; / WHAT: DB "WHAT?", $0DH, $0AH ;; .ASCII /WHAT? ;; / SORRY: DB "SORRY", $0DH, $0AH ;; .ASCII /SORRY ;; / ; ; HAUPTPROGRAMM ; LEGT PROGRAMM IM SPEICHER AB ; DEFINIERT REGISTER ; LIEST EINE BENUTZERZEILE UM ; DIESE ZU VERARBEITEN ; RSTART: LXI SP,STACK ST1: CALL CRLF LXI D,OK SUB A CALL PRTSTG LXI H,ST2+1 SHLD CURRNT ST2: LXI H,8 SHLD LOPVAR SHLD STKGOS ST3: MVI A,">" CALL GETLN PUSH D CALL DBUFF CALL TSTNUM CALL IGNB MOV A,H ORA L POP B JZ DIRECT DCX D MOV A,H STAX D DCX D MOV A,L STAX D PUSH B PUSH D MOV A,C SUB E PUSH PSW CALL FNDLN PUSH D JNZ ST4 PUSH D CALL FNDNXT POP B LHLD TXTUNF CALL MVUP MOV H,B MOV L,C SHLD TXTUNF ST4: POP B LHLD TXTUNF POP PSW PUSH H CPI 3 JZ RSTART ADD L MOV L,A MVI A,0 ADC H MOV H,A CALL DTXTE CALL COMP JNC QSORRY SHLD TXTUNF POP D CALL MVDOWN POP D POP H CALL MVUP JMP ST3 ; ; NEW STOP RUN GOTO UPR ; NEW: CALL ENDCHK LXI H,TXTBGN SHLD TXTUNF STOP: CALL ENDCHK JMP RSTART RUN: CALL ENDCHK LXI D,TXTBGN RUNNXL: LXI H,0 CALL FNDLP JC RSTART RUNTSL: XCHG SHLD CURRNT XCHG INX D INX D RUNSML: CALL CONT LXI H,TAB2-1 JMP EXEC GOTO: CALL EXPR PUSH D CALL ENDCHK CALL FNDLN JNZ AHOW POP PSW JMP RUNTSL ; ; LIST PRINT UPR ; LIST: CALL TSTNUM CALL ENDCHK CALL FNDLN LS1: JC RSTART CALL PRTLN CALL CONT CALL FNDLP JMP LS1 PRINT: MVI C,6 CALL TSTC .BYTE 038H .BYTE PR2-$-1 CALL CRLF JMP RUNSML PR2: CALL TSTC .BYTE 0DH .BYTE PR0-$-1 CALL CRLF JMP RUNNXL PR0: CALL TSTC .BYTE 023H .BYTE PR1-$-1 CALL EXPR MOV C,L JMP PR3 PR1: CALL QTSTG JMP PR8 PR3: CALL TSTC .BYTE 02CH .BYTE PR6-$-1 CALL FIN JMP PR0 PR6: CALL CRLF CALL FINI PR8: CALL EXPR PUSH B CALL PRTNUM POP B JMP PR3 ; ; GOSUB RETURN UPR ; GOSUB: CALL PUSHA CALL EXPR PUSH D CALL FNDLN JNZ AHOW LHLD CURRNT PUSH H LHLD STKGOS PUSH H LXI H,0 SHLD LOPVAR DAD SP SHLD STKGOS JMP RUNTSL RETURN: CALL ENDCHK LHLD STKGOS MOV A,H ORA L JZ QWHAT SPHL POP H SHLD STKGOS POP H SHLD CURRNT POP D CALL POPA CALL FINI ; ; FOR NEXT UPR ; FOR: CALL PUSHA CALL SETVAL DCX H SHLD LOPVAR LXI H,TAB5-1 JMP EXEC FR1: CALL EXPR SHLD LOPLMT LXI H,TAB6-1 JMP EXEC FR2: CALL EXPR JMP FR4 FR3: LXI H,1 FR4: SHLD LOPINC FR5: LHLD CURRNT SHLD LOPLN XCHG SHLD LOPPT LXI B,0AH LHLD LOPVAR XCHG MOV H,B MOV L,B DAD SP .BYTE 03EH FR7: DAD B MOV A,M INX H ORA M Jz FR8 MOV A,M DCX H CMP D JNZ FR7 MOV A,M CMP E JNZ FR7 XCHG LXI H,0 DAD SP MOV B,H MOV C,L LXI H,0AH DAD D CALL MVDOWN SPHL FR8: LHLD LOPPT XCHG CALL FINI NEXT: CALL TSTV JC QWHAT SHLD VARNXT NX0: PUSH D XCHG LHLD LOPVAR MOV A,H ORA L JZ AWHAT CALL COMP JZ NX3 POP D CALL POPA LHLD VARNXT JMP NX0 NX3: MOV E,M INX H MOV D,M LHLD LOPINC PUSH H MOV A,H XRA D MOV A,D DAD D JM NX4 XRA H JM NX5 NX4: XCHG LHLD LOPVAR MOV M,E INX H MOV M,D LHLD LOPLMT POP PSW ORA A JP NX1 XCHG NX1: CALL CKHLDE POP D JC NX2 LHLD LOPLN SHLD CURRNT LHLD LOPPT XCHG CALL FINI NX5: POP H POP D NX2: CALL POPA CALL FINI ; ; REM IF INPUT LET UPR ; REM: LXI H,0 JMP IFFR IFF: CALL EXPR IFFR: MOV A,H ORA L JNZ RUNSML CALL FNDSKP JNC RUNTSL JMP RSTART INPERR: LHLD STKINP SPHL POP H SHLD CURRNT POP D POP D INPUT: IP1: PUSH D CALL QTSTG JMP IP2 CALL TSTV JC IP4 JMP IP3 IP2: PUSH D CALL TSTV JC QWHAT LDAX D MOV C,A SUB A STAX D POP D CALL PRTSTG MOV A,C DCX D STAX D IP3: PUSH D XCHG LHLD CURRNT PUSH H LXI H,IP1 SHLD CURRNT LXI H,0 DAD SP SHLD STKINP PUSH D MVI A,03AH CALL GETLN CALL DBUFF CALL EXPR CALL CONT POP D XCHG MOV M,E INX H MOV M,D POP H SHLD CURRNT POP D IP4: POP PSW CALL TSTC .BYTE "," .BYTE IP5-$-1 JMP IP1 IP5: CALL FINI DEFLT: LDAX D CPI 0DH JZ LT1 LET: CALL SETVAL CALL TSTC .BYTE "," .BYTE LT1-$-1 JMP LET LT1: CALL FINI ; ; EXPR UPR ; EXPR: CALL EXPR2 PUSH H EXPR1: LXI H,TAB8-1 JMP EXEC XP11: CALL XP18 RC MOV L,A RET XP12: CALL XP18 RZ MOV L,A RET XP13: CALL XP18 RZ RC MOV L,A RET XP14: CALL XP18 MOV L,A RZ RC MOV L,H RET XP15: CALL XP18 RNZ MOV L,A RET XP16: CALL XP18 RNC MOV L,A RET XP17: POP H RET XP18: MOV A,C POP H POP B PUSH H PUSH B MOV C,A CALL EXPR2 XCHG XTHL CALL CKHLDE POP D LXI H,0 MVI A,1 RET EXPR2: CALL TSTC .BYTE 02DH .BYTE XP21-$-1 LXI H,8 JMP XP26 XP21: CALL TSTC .BYTE 02BH .BYTE XP22-$-1 xP22: CALL EXPR3 XP23: CALL TSTC .BYTE 02BH .BYTE XP25-$-1 PUSH H CALL EXPR3 XP24: XCHG XTHL MOV A,H XRA D MOV A,D DAD D POP D JM XP23 XRA H JP XP23 JMP QHOW XP25: CALL TSTC .BYTE 02DH .BYTE XP42-$-1 XP26: PUSH H CALL EXPR3 CALL CHGSGN JMP XP24 EXPR3: CALL EXPR4 XP31: CALL TSTC .BYTE 02AH .BYTE XP34-$-1 PUSH H CALL EXPR4 MVI B,0 CALL CHKSGN XTHL CALL CHKSGN XCHG XTHL ;;;;;;;;; MOV A,H ORA A JZ XP32 MOV A,D ORA D XCHG JNZ AHOW XP32: MOV A,L LXI H,0 ORA A JZ XP35 XP33: DAD D JC AHOW DCR A JNZ XP33 JMP XP35 XP34: CALL TSTC .BYTE 02FH .BYTE XP42-$-1 PUSH H CALL EXPR4 MVI B,0 CALL CHKSGN XTHL CALL CHKSGN XCHG XTHL XCHG MOV A,D ORA E JZ AHOW PUSH B CALL DIVIDE MOV H,B MOV L,C POP B XP35: POP D MOV A,H ORA A JM QHOW MOV A,B ORA A CM CHGSGN JMP XP31 EXPR4: LXI H,TAB4-1 JMP EXEC XP40: CALL TSTV JC XP41 MOV A,M INX H MOV H,M MOV L,A RET XP41: CALL TSTNUM MOV A,B ORA A RNZ PARN: CALL TSTC .BYTE 028H .BYTE XP43-$-1 CALL EXPR CALL TSTC .BYTE 029H .BYTE XP43-$-1 XP42: RET XP43: JMP QWHAT RND: CALL PARN MOV A,H ORA A JM QHOW ORA L JZ QHOW PUSH D PUSH H LHLD RANPNT LXI D,LSTROM CALL COMP JC RA1 LXI H,START RA1: MOV E,M INX H MOV D,M SHLD RANPNT POP H XCHG PUSH B CALL DIVIDE POP B POP D INX H RET ABS: CALL PARN DCX D CALL CHKSGN INX D RET SIZE: LHLD TXTUNF PUSH D XCHG LHLD TXTEND CALL SUBDE POP D RET ; ; DIVIDE SUBDE CHKSGN CHGSGN ; CKHLDE UPR ; DIVIDE: PUSH H MOV L,H MVI H,0 CALL DV1 MOV B,C MOV A,L POP H MOV H,A DV1: MVI C,0FFH DV2: INR C CALL SUBDE JNC DV2 DAD D RET SUBDE: MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A RET CHKSGN: MOV A,H ORA A RP CHGSGN: MOV A,H ORA L RZ MOV A,H PUSH PSW CMA MOV H,A MOV A,L CMA MOV L,A INX H POP PSW XRA H JP QHOW MOV A,B XRI 080H MOV B,A RET CKHLDE: MOV A,H XRA D JP CK1 XCHG CK1: CALL COMP RET ; ; SETVAL FIN ENDCHK ERROR UPR ; SETVAL: CALL TSTV JC QWHAT PUSH H CALL TSTC .BYTE 03DH .BYTE SV1-$-1 CALL EXPR MOV B,H MOV C,L POP H MOV M,C INX H MOV M,B RET SV1: JMP QWHAT FIN: CALL TSTC .BYTE 03BH .BYTE FI1-$-1 POP PSW JMP RUNSML FI1: CALL TSTC .BYTE 0DH .BYTE FI2+1 POP PSW JMP RUNNXL FI2: RET ENDCHK: CALL IGNB CPI 0DH RZ QWHAT: PUSH D AWHAT: LXI D,WHAT ERROR: SUB A CALL PRTSTG POP D LDAX D PUSH PSW SUB A STAX D LHLD CURRNT PUSH H MOV A,M INX H ORA M POP D JZ RSTART MOV A,M ORA A JM INPERR CALL PRTLN DCX D POP PSW STAX D MVI A,03FH CALL OUTC SUB A CALL PRTSTG JMP RSTART QSORRY: PUSH D ASORRY: LXI D,SORRY JMP ERROR ; ; GETLN FNDLN UPR ; GETLN: CALL OUTC CALL DBUFF GL1: CALL CHKIO CPI 1 JZ GL3 CALL OUTC CPI 0AH JZ GL1 ORA A JZ GL1 CPI 01BH JZ GL4 STAX D INX D CPI 0DH RZ MOV A,E CALL CXBUFE JNZ GL1 GL3: MOV A,E CALL CXBUFA JZ GL4 DCX D MVI A,8 CALL OUTC JMP GL1 GL4: CALL CRLF MVI A,0BH JMP GETLN FNDLN: MOV A,H ORA A JM QHOW LXI D,TXTBGN FNDLP: FL1: PUSH H LHLD TXTUNF DCX H CALL COMP POP H RC LDAX D SUB L MOV B,A INX D LDAX D SBB H JC FL2 DCX D ORA B RET FNDNXT: INX D FL2: INX D FNDSKP: LDAX D CPI 0DH JNZ FL2 INX D JMP FL1 ; ; PRTSTG GTSTG PRTNUM PRTLN UPR ; PRTSTG: MOV B,A PS1: LDAX D INX D CMP B RZ CALL OUTC CPI 0DH JNZ PS1 RET QTSTG: CALL TSTC .BYTE 22H .BYTE QT3-$-1 MVI A,022H QT1: CALL PRTSTG CPI 0DH POP H JZ RUNNXL QT2: INX H INX H INX H PCHL QT3: CALL TSTC .BYTE 027H .BYTE QT4-$-1 MVI A,027H JMP QT1 QT4: CALL TSTC .BYTE 05FH .BYTE QT5-$-1 MVI A,08DH CALL OUTC CALL OUTC POP H JMP QT2 QT5: RET PRTNUM: MVI B,0 CALL CHKSGN JP PN1 MVI B,02DH DCR C PN1: PUSH D LXI D,0AH PUSH D DCR C PUSH B PN2: CALL DIVIDE MOV A,B ORA C JZ PN3 XTHL DCR L PUSH H MOV H,B MOV L,C JMP PN2 PN3: POP B PN4: DCR C MOV A,C ORA A JM PN5 MVI A,020H CALL OUTC JMP PN4 PN5: MOV A,B ORA A CNZ OUTC MOV E,L PN6: MOV A,E CPI 0AH POP D RZ ADI 030H CALL OUTC JMP PN6 PRTLN: LDAX D MOV L,A INX D LDAX D MOV H,A INX D MVI C,4 CALL PRTNUM MVI A,020H CALL OUTC SUB A CALL PRTSTG RET ; ; MVUP MVDOUN POPA PUSHA UPR ; MVUP: CALL COMP RZ LDAX D STAX B INX D INX B JMP MVUP MVDOWN: MOV A,B SUB D JNZ MD1 MOV A,C SUB E RZ MD1: DCX D DCX H LDAX D MOV M,A JMP MVDOWN POPA: POP B POP H SHLD LOPVAR MOV A,H ORA L JZ PP1 POP H SHLD LOPINC POP H SHLD LOPLMT POP H SHLD LOPLN POP H SHLD LOPPT PP1: PUSH B RET PUSHA: LXI H,STKLMT CALL CHGSGN POP B DAD SP JNC QSORRY LHLD LOPVAR MOV A,H ORA L JZ PU1 LHLD LOPPT PUSH H LHLD LOPLN PUSH H LHLD LOPLMT PUSH H LHLD LOPINC PUSH H LHLD LOPVAR PU1: PUSH H PUSH B RET ; ;* OUTC CHKIO UPR * ; START: LXI SP,STACK MVI A,0FFH INIT: STA OCSW MVI D,3 PATLOP: CALL CRLF DCR D JNZ PATLOP SUB A LXI D,MSG1 CALL PRTSTG LXI H,START SHLD RANPNT LXI H,TXTBGN SHLD TXTUNF LXI H,TXTE SHLD TXTEND LXI H,BUFA SHLD BUFFER LXI H,BUFE SHLD BUFEND JMP RSTART CRLF: MVI A,0DH OUTC: PUSH B PUSH PSW LDA OCSW ORA A OC2: JNZ OC3 POP PSW POP B RET OC3: POP PSW PUSH PSW MOV C,A LPT: MOV A,C CPI 0DH JZ LINEF H1: CALL ECHO POP PSW POP B RET LINEF: MVI C,0DH CALL ECHO MVI C,0AH JMP H1 CHKIO: CALL CI ANI 7FH CPI 2 JNZ CI1 LDA OCSW CMA STA OCSW JMP CHKIO CI1: CPI 3 RNZ JMP RSTART MSG1: DB "RDK PROMPT BASIC V3.3 3K" DB $0D, $0A ; .ASCII "RDK PRO\ ; \MPT "" ; .ASCII "BASIC V\ ; \3.2 3K\ ; \ ; " ; ; TABLES DIRECT EXEC ; KERNE ;; .OPSYN .WORD, DWA5 ;; .OPSYN .ASCIZ,TX TAB1: ;; TX DB "LIST", 0 DW LIST ;; TX DB "RUN", 0 DW RUN ;; TX DB "NEW", 0 DW NEW ;; TX DB "BYE", 0 DW BYE ;; TX DB "END", 0 DW END TAB2: ;; TX DB "NEXT", 0 DW NEXT DB "LET", 0 DW LET DB "IF", 0 DW IFF DB "GOTO", 0 DW GOTO DB "GOSUB", 0 DW GOSUB DB "RETURN", 0 DW RETURN DB "REM", 0 DW REM DB "FOR", 0 DW FOR DB "INPUT", 0 DW INPUT DB "PRINT", 0 DW PRINT DB "STOP", 0 DW STOP DB "CALL", 0 DW CALL DB "OUTCHAR", 0 DW OUTCHAR DB "OUT", 0 DW OUT DB "O$", 0 DW O DB "I$", 0 DW I DB "POKE", 0 DW POKE DB "TAB", 0 DW TAB DB "BYTE", 0 DW BYTE DB "WORD", 0 DW WORD .BYTE 0 DW DEFLT TAB4: DB "RND", 0 DW RND DB "ABS", 0 DW ABS DB "SIZE", 0 DW SIZE DB "PEEK", 0 DW PEEK DB "INCHAR", 0 DW INCHAR DB "HEX", 0 DW HEX DB "IN", 0 DW IN DB "'", 0 DW QUOTE DB "TOP", 0 DW TOP DB "LEN", 0 DW LENGTH DB "CSTS", 0 DW CSTAT .BYTE 0 DW XP40 TAB5: DB "TO", 0 DW FR1 .BYTE 0 DW QWHAT TAB6: DB "STEP", 0 DW FR2 .BYTE 0 DW FR3 TAB8: DB ">=", 0 DW XP11 DB "#", 0 DW XP12 DB ">", 0 DW XP13 DB "=", 0 DW XP15 DB "<=", 0 DW XP14 DB "<", 0 DW XP16 .BYTE 0 DW XP17 ; ;* DIRECT MODUL * ; DIRECT: LXI H,TAB1-1 EXEC: EX0: CALL IGNB PUSH D EX1: LDAX D INX D CPI "." JZ EX3 INX H CMP M JZ EX1 MVI A,0 DCX D CMP M JZ EX5 EX2: INX H CMP M JNZ EX2 INX H INX H POP D JMP EX0 EX3: MVI A,0 EX4: INX H CMP M JNZ EX4 EX5: INX H MOV A,M INX H MOV H,M MOV L,A POP P PCHL ; ;* END EXEC * ; DBUFF: PUSH H LHLD BUFFER MOV D,H MOV E,L POP H RET DTXTE: PUSH H LHLD TXTEND MOV D,H MOV E,L POP H RET CXBUFE: PUSH H LHLD BUFEND CMP L POP H RET CXBUFA: PUSH H LHLD BUFFER CMP L POP H RET END: CALL EXPR XCHG LXI H,TXTE XCHG CALL COMP JC ASORRY MOV A,H ORA A JM ASORRY MOV A,M CMA MOV M,A MOV B,M CMP B JNZ ASORRY SHLD BUFEND MOV A,L SUI 132 MOV L,A MOV A,H SBI 0 MOV H,A SHLD BUFFER DCX H DCX H SHLD TXTEND JMP RSTART BYE: RST 7 JMP RSTART CALL: CALL EXPR PUSH D LXI B,HERE PUSH B PCHL HERE: POP D CALL FINI OUT: CALL PARN PUSH H CALL TSTC .BYTE "=" .BYTE RSV0-$-1 CALL EXPR MOV B,L MVI A,0D3H STA IOBUFA POP H MOV A,L STA IOBUFB MVI A,0C9H STA IOBUFC MOV A,B CALL IOBUFA CALL FINI RSV0: JMP QWHAT TAB: CALL PARN A1: MOV A,H ORA L CZ FINI DCX H MVI A,20H CALL OUTC JMP A1 IN: CALL PARN PUSH H MVI A,0DBH STA IOBUFA POP H MOV A,L STA IOBUFB MVI A,0C9H STA IOBUFC CALL IOBUFA MVI H,0 MOV L,A RET O: CALL EXPR PUSH D XCHG XRA A CALL PRTSTG POP D CALL FINI I: CALL EXPR PUSH D XCHG LHLD TXTUNF XCHG CALL COMP JC ASORRY CALL DBUFF CALL GL1 MOV B,H MOV C,L XCHG DCX H CALL DBUFF PUSH D CALL MVUP XRA A STAX B POP D INX H CALL SUBDE XCHG LXI H,LEGT MOV M,E INX H MOV M,D POP D CALL FINI PEEK: CALL PARN MOV L,M MVI H,0 RET POKE: CALL EXPR PUSH H CALL TSTC .BYTE "," .BYTE PK1-$-1 CALL EXPR MOV A,L POP H MOV M,A CALL FINI PK1: JMP QWHAT BYTE: CALL PARN MOV A,L CALL WRIT2 CALL FINI WORD: CALL PARN MOV A,H CALL WRIT2 MOV A,L CALL WRIT2 CALL FINI WRIT2: PUSH PSW RRC RRC RRC RRC CALL IST POP PSW IST: ANI 0FH ADI 90H DAA ACI 40H DAA JMP OUTC CSTAT: CALL CSTS CMA MOV L,A MVI H,0 RET QUOTE: LDAX D INX D MOV L,A MVI H,0 CALL TSTC .BYTE "'" .BYTE ASCI-$-1 RET ASCI: JMP QWHAT TOP: LHLD TXTUNF INX H RET LENGTH: LHLD LEGT DCX H RET OUTCHAR: CALL EXPR MOV A,L CALL OUTC CALL FINI INCHAR: CALL CHKIO MVI H,0 MOV L,A RET HEX: PUSH B LXI H,80 CALL TSTC .BYTE "(" .BYTE HN2-$-1 HNXTH: LDAX D CPI 0DH JZ QWHAT CALL CNVBN DAD H DAD H DAD H DAD H MVI B,0 MOV C,A DAD B INX D CALL TSTC .BYTE ")" .BYTE HN1-$-1 JMP POPRET HN1: JMP HNXTH HN2: JMP QWHAT POPRET: POP B RET CNVBN: CPI 30H JM QWHAT CPI 39H JM CONTC JZ CONTC CPI 41H JM QWHAT CPI 47H JP QWHAT CONTC: SUI 30H CPI 10 RM SUI 7 RET CONT: CALL CSTS RZ CALL CI CPI 3 RNZ JMP RSTART ENDE:NOP .ORG 2000H ;; RAM=\ "RAM LOCATION" ;;.LOC RAM ; ;; .OPSYN .BLKB,DS ; LEGT: DS 2 IOBUFA: DS 1 IOBUFB: DS 1 IOBUFC: DS 1 LSTROM: DS 1 OCSW: DS 1 CURRNT: DS 2 STKGOS: DS 2 VARNXT: DS 2 STKINP: DS 2 LOPVAR: DS 2 LOPINC: DS 2 LOPLMT: DS 2 LOPLN: DS 2 LOPPT: DS 2 RANPNT: DS 2 TXTUNF: DS 2 DS 40 STKLMT: DS 2 DS 200 STACK: DS 2 VARBGN: DS 55 TXTEND: DS 2 BUFFER: DS 2 BUFEND: DS 2 TXTBGN: DS 2 DS 600 TXTE: DS 2 BUFA: DS 64 BUFE: DS 1 .END